MongoDB副本集配置

系统环境

  • 操作系统版本
1
2
$ cat/etc/redhat-release
// out: CentOS Linux release 7.4.1708 (Core)
  • mongodb 版本
1
2
$ mongo --version
// out: MongoDB shell version: 2.6.12

配置MongoDB Repository

  • 创建 /etc/yum.repos.d/mongodb.repo 文件
1
$ vim /etc/yum.repos.d/mongodb.repo
  • 编辑内容:
1
2
3
4
5
[mongodb]     
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

上面的mongdb仓库使用的是mongodb官网的,版本比较老,我安装的时候是2.6.12,如果使用清华大学的mongodb镜像版本为3.2.X

安装MongoDB

不管是主、从、还是仲裁,三个都需要安装mongdb

1
$ sudo yum install mongodb-org

启动MongoDB

1
2
3
4
$ sudo systemctl start mongod
// or
// $ sudo service mongod start
// 本质上还是执行第一条指令

开机自启

1
$ /sbin/chkconfig mongod on

配置数据库

1
$ mongo
1
2
3
4
5
6
7
8
9
10
11
12
13
> use admin
> db.createUser(
{
user: "root",
pwd: "root",
roles: [{
role: "userAdminAnyDatabase",
db: "admin"
}]
}
)
// 验证权限是否生效
> db.auth("root", "root")

MongoDB数据库角色

  • 数据库用户角色: read、 readWrite
  • 数据库管理角色: dbAdmin、dbOwner、userAdmin
  • 集群管理角色:clusterAdmin、 clusterManager、clusterMonitor、hostManager
  • 备份恢复角色:backup、restore
  • 所有数据库角色: readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  • 超级用户角色:root
  • 内部角色: __system

角色说明

Read 允许用户读指定数据库
readWrite 允许用户读写指定数据库
dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除、查看统计、或访问system.profile
dbOwner 允许用户对某个数据库进行所有操作
userAdmin 允许用户向system.users集合写入,可以查找指定数据库里创建、删除和管理用户
clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
clusterManager 在集群上提供管理和监视行为,这个角色可以访问config和local 数据库,用于分片和复制
readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase 只在admin数据库中可用,赋予用户所有书苦苦的读写权限
userAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
root 只在admin数据库中可用,超级账号,超级权限

参考教程 :

  1. 如何对MongoDB 3.2.7进行用户权限管理配置
  2. 官方文档

MongoDB 操作

  1. 查看mongo 版本
    $ mongo –version // or in mongo use > db.version()
  2. 查看所有数据库
    > show dbs
  3. 查看集合
    > show collections
  4. 查看用户
    > show users
  5. 进入数据库
    > user db-name
  6. 显示数据操作命令
    > db.help()
  7. 显示指定数据库的集合下的操作命令
    > db.collection_name.help()
  8. 查找指定数据库的集合,所有的条目
    > db.collection_name.find()
  9. 查找指定数据库的集合,有条件限制
    > db.collection_name.find({key: value})
    // 查找collection_name集合下的属性为key,值为value的项目
  10. 删除数据库
    > db.dropDatabase()
  11. 克隆指定数据库到本机上
    > db.cloneDatabase(“127.0.0.1”)
  12. 恢复当前数据库
    > db.repairDatabase()
  13. 获取当前数据库的名字
    > db.getName() or db
  14. 查看链接当前db的机器
    > db.getMongo()
  15. 查看数据库服务器的状态
    > db.serverStatus()

配置各个主机的主机名代替ip地址

PRIMARY: ip: 192.168.8.126 port: 27017 hostname: mongo1
SECONDARY: ip: 192.168.8.128 port: 27017 hostname: mongo2
ARBITER: ip: 192.168.8.127 port: 27017 hostname: message

以mongo1为例:

1
$ sudo hostnamectl set-hostname mongo1

修改各个主机的hosts文件

mongo1:

1
2
3
4
5
6
7
$ sudo vim /etc/hosts

# /etc/hosts

127.0.0.1 mongo1
192.168.8.128 mongo2
192.168.8.127 message

mongo2:

1
2
3
4
5
6
7
$ sudo vim /etc/hosts

# /etc/hosts

127.0.0.1 mongo2
192.168.8.126 mongo1
192.168.8.127 message

message(仲裁节点):

1
2
3
4
5
6
7
$ sudo vim /etc/hosts

# /etc/hosts

127.0.0.1 message
192.168.8.126 mongo1
192.168.8.128 mongo2

配置复制集

需要在主、从、仲裁中都要配置

1
2
3
4
5
6
7
$ sudo vim /etc/mongod.conf

# /etc/mongod.conf
# 注释 bind_ip = 127.0.0.1
# bind_ip = 127.0.0.1
# 取消replSet的注释,并设置复制集名称
replSet=myReplSet

重启mongodb

1
2
$ sudo service mongod restart 
// or sudo systemctl restart mongod.service

配置之前关闭防火墙和selinux

Centos7中已经不使用iptables,默认使用firewall

  1. 关闭防火墙

    $ sudo systemctl stop firewalld.service
    $ sudo systemctl disable firewalld.service # 禁止开机自启

  2. 关闭selinux

    $ sudo vim /etc/sysconfig/selinux

# /etc/sysconfig/selinux
取消注释 #SELINUX=enforcing
改为
SELINUX=disabled
保存退出后 执行
$ setenforce 0 // 设置SELINUX状态
$ getenforce // 获取SELINUX状态
Permissive

参考教程:

centos7 关闭防火墙和selinux

配置主节点

$ mongo
> use admin
> rs.initiate()
> rs.add("mongo2:27017")
loit:PRIMARY> rs.addArb("message:27017")
loit:PRIMARY> rs.status()
// out 
{
        "set" : "myReplSet",
        "date" : ISODate("2018-09-23T04:16:10Z"),
        "myState" : 1,
        "members" : [
                {
                        "_id" : 0,
                        "name" : "mongo1:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 8178,
                        "optime" : Timestamp(1537668470, 1),
                        "optimeDate" : ISODate("2018-09-23T02:07:50Z"),
                        "electionTime" : Timestamp(1537668114, 1),
                        "electionDate" : ISODate("2018-09-23T02:01:54Z"),
                        "self" : true
                },
                {
                        "_id" : 1,
                        "name" : "mongo2:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 8054,
                        "optime" : Timestamp(1537668470, 1),
                        "optimeDate" : ISODate("2018-09-23T02:07:50Z"),
                        "lastHeartbeat" : ISODate("2018-09-23T04:16:09Z"),
                        "lastHeartbeatRecv" : ISODate("2018-09-23T04:16:09Z"),
                        "pingMs" : 3,
                        "syncingTo" : "mongo1:27017"
                },
                {
                        "_id" : 2,
                        "name" : "message:27017",
                        "health" : 1,
                        "state" : 7,
                        "stateStr" : "ARBITER",
                        "uptime" : 8176,
                        "lastHeartbeat" : ISODate("2018-09-23T04:16:09Z"),
                        "lastHeartbeatRecv" : ISODate("2018-09-23T04:16:09Z"),
                        "pingMs" : 0
                }
        ],
        "ok" : 1
}

测试

在主库中添加测试测试数据后,在从从库中也会同步;
如果主库关闭,从库会充当主库;
此时如果原主库再启动,则变为从库;

搭建中遇到的问题

1.在rs.add(hostname:port)时候报 code:13144

  • 注意关闭防火墙,setlinux 或者添加规则
  • 注意注释掉bind_ip = 127.0.0.1 或者改为 bind_ip = 0.0.0.0
  • 注意指定replSet 在 mongod.conf中

    参考教程:

    Adding members to Replica Set on MongoDb

2.在rs.createUser()时报错

Error: couldn’t add user: not master at src/mongo/shell/db.js:1004
将mongod.conf中的replSet注释掉

参考教程:

Can’t create user

3.在从库中无法查看数据库中的数据报 code: 13435

error: { “$err” : “not master and slaveOk=false”, “code” : 13435 }
注意看错误信息: 不是主机,slaveOk=false

解决方案:
进入mongo控制台
输入
> rs.slaveOk()
即可

参考教程:

mongodb, replicates and error: { “$err” : “not master and slaveOk=false”, “code” : 13435 }

意外情况

1.三个机器只有一个运行 rs.initiate(),如果其他机器运行了,则需要清除

$ mongo
> use local
> db.dropDabase()
> exit
$ service mongod restart

2.卸载数据库

  • 停止服务
    $ sudo systemctl stop mongod
  • 删除安装包
    $ sudo yum erase $(rpm -qa | grep mongod-org)
  • 删除数据与日志
    $ sudo rm -rf /var/log/mongodb
    $ sudo rm -rf /var/lib/mongo